/*
 * Copyright 2010 Google Inc.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
 * in compliance with the License. You may obtain a copy of the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software distributed under the License
 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
 * or implied. See the License for the specific language governing permissions and limitations under
 * the License.
 */
package net.rvb1.gwt.grad.ui.client.cellview.pager;

import com.google.gwt.core.client.GWT;
import com.google.gwt.i18n.client.HasDirection;
import com.google.gwt.resources.client.ClientBundle;
import com.google.gwt.resources.client.CssResource;
import com.google.gwt.resources.client.ImageResource;
import com.google.gwt.resources.client.ImageResource.ImageOptions;
import com.google.gwt.resources.client.ImageResource.RepeatStyle;
import com.google.gwt.user.cellview.client.AbstractPager;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.view.client.HasRows;
import com.google.gwt.view.client.Range;

/**
 * A pager that displays the current range without any controls to change the range.
 */
public class RangeLabelPager<T extends HasRows> extends AbstractPager<T> {

  public interface Resources extends ClientBundle {
    @Source("net/rvb1/gwt/grad/ui/client/cellview/pager/RangeLabelPagerBackground.png")
    @ImageOptions(repeatStyle = RepeatStyle.Horizontal)
    ImageResource backgroundImage();

    @Source("RangeLabelPager.css")
    Styles styles();
  }

  public interface Styles extends CssResource {
    String label();
  }

  /**
   * The label that shows the current range.
   */
  private final HTML label = new HTML();

  private Styles styles;

  /**
   * Construct a new {@link RangeLabelPager}.
   */
  public RangeLabelPager() {
    this(GWT.<Resources> create(Resources.class));
  }

  public RangeLabelPager(Resources resources) {
    initWidget(label);

    this.styles = resources.styles();
    this.styles.ensureInjected();

    this.label.addStyleName(this.styles.label());
  }

  @Override
  protected void onRangeOrRowCountChanged() {
    HasRows display = getDisplay();
    Range range = display.getVisibleRange();
    int start = range.getStart();
    int end = start + range.getLength();
    this.label.setText(start + " - " + end + " : " + display.getRowCount(),
        HasDirection.Direction.LTR);
  }
}
